/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_STL_POOL_MEM_ITEM_H__
#define __XOS_STL_POOL_MEM_ITEM_H__

#include <string>
#include <list>
#include <map>

namespace xos_stl
{

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 
    // mem_item, 所有内存池结点都从它继承出来
    // 

    template< class T, class Lock = fake_lock >
    class mem_item
    {
    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 

        using LOCK_FREE_INTERFACE_QUEUE = lock_free::lock_free_queue< xos::i_release, Lock >;
        using LOCK_FREE_ITEM_QUEUE = lock_free::lock_free_queue< T, Lock >;

        using AUTO_LIST = interface_list< T, Lock >;
        using CONST_AUTO_ITER = typename AUTO_LIST::const_iterator;
        using AUTO_ITER = typename AUTO_LIST::iterator;

        using LIST = item_list< T, Lock >;
        using CONST_ITER = typename LIST::const_iterator;
        using ITER = typename LIST::iterator;

        using STR_MAP = item_map< std::string, T, Lock >;
        using CONST_STR_ITER = typename STR_MAP::const_iterator;
        using STR_ITER = typename STR_MAP::iterator;

        using INT_MAP = item_map< int, T, Lock >;
        using CONST_INT_ITER = typename INT_MAP::const_iterator;
        using INT_ITER = typename INT_MAP::iterator;

        using POOL = lock_free::lock_free_pool< T, Lock >;

        using ITEM_DATA = xos_item_data<T>;
        using ITEM = mem_item< T, Lock >;

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        mem_item()
        {
        }
        ~mem_item()
        {
        }

    public:
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static T* get_item_from_pool()
        {
            return T::pool()->get_item();
        }
        void put_back_to_pool()
        {
            T* pT = static_cast<T*>(this);
            T::pool()->put_item( pT );
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static int init_all()
        {
            int ret = 0;
            if( 0 == ret )
            {
                ret = item_data().init();
            }
            if( 0 == ret )
            {
                ret = T::static_user_init();
            }
            return ret;
        }
        static int term_all()
        {
            int ret = 0;
            if( 0 == ret )
            {
                ret = T::static_user_term();
            }
            if( 0 == ret )
            {
                ret = item_data().term();
            }
            return ret;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static ITEM_DATA& item_data()
        {
            ITEM_DATA* data_ptr = 0;
            T::get_xos_item_data( data_ptr );
            return *data_ptr;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static LIST* list()
        {
            return item_data().list_ptr;
        }
        static POOL* pool()
        {
            return item_data().pool_ptr;
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static int static_user_init()
        {
            int ret = 0;
            return ret;
        }
        static int static_user_term()
        {
            int ret = 0;
            return ret;
        }
    };

} // xos_stl

#endif // __XOS_STL_POOL_MEM_ITEM_H__
